Homomorphic Mapped Type
P in keyof Tの形のMapped Typesのこと
{ [K in keyof T1]: T2 }
({ [K in T]: T2 }ではなく)
普通のMapped Typesにはない特別な挙動をする
特別な挙動は以下の3つ ref
T1のmodifier (e.g. readonly, ?)を引き継ぐ
T1が配列のときは、結果も配列になる
→ Mapped Tuple Type
(T1が型引数のときのみ) Distributive Unionになる
↑これマジでヤバすぎ仕様だと思うmrsekut.icon
初見だと絶対に理解できない
謎な挙動をしていることには気付くが、どの記法がトリガーになっているのかわからない
利便性のために一貫性を捻じ曲げたデザインになってる
例
keyof Tという形が大事なので、(keyof T)にすると結果が変わる
code:ts
type R = { readonly foo: number; bar?: string };
// { readonly foo: boolean; bar?: boolean | undefined };
type A1 = { P in keyof R: boolean };
// { foo: boolean; bar: boolean };
type A2 = { P in (keyof R): boolean };
制約型が keyof M の形で、かつ 修飾子型 M が型変数のときはHomomorphic Mapped Typesと呼ばれ、さらに特別な動作をします。 ref
any、またお前か——配列とhomomorphic mapped typeの罠
わかりやすい
https://zenn.dev/qnighy/articles/dde3d980b5e386#homomorphic-mapped-types
https://stackoverflow.com/questions/59790508/what-does-homomorphic-mapped-type-mean